import request from '@/config/axios'
import { getAccessToken, getTenantId } from '@/utils/auth'
import { fetchEventSource } from '@microsoft/fetch-event-source'
import { pathResolve } from '@/utils'

// 聊天VO
export interface ChatMessageVO {
  id: number // 编号
  conversationId: number // 对话编号
  type: string // 消息类型
  userId: string // 用户编号
  roleId: number // 角色编号
  model: string // 模型标志
  modelId: number // 模型编号
  content: string // 聊天内容
  tokens: number // 消耗 Token 数量
  segmentIds?: number[] // 段落编号
  segments?: {
    id: number // 段落编号
    content: string // 段落内容
    documentId: number // 文档编号
    documentName: string // 文档名称
  }[]
  createTime: Date // 创建时间
  roleAvatar: string // 角色头像
  userAvatar: string // 用户头像
}

const tenantEnable = import.meta.env.VITE_APP_TENANT_ENABLE === 'true'

// AI chat 聊天消息
export const ChatMessageApi = {
  // 消息列表
  getChatMessageListByConversationId: async (conversationId: number) => {
    return await request.get({
      url: `/ai/chat/message/list-by-conversation-id`,
      params: { conversationId }
    })
  },

  // 发送 Stream 消息
  // 为什么不用 axios 呢？因为它不支持 SSE 调用
  sendChatMessageStream: async (
    conversationId: number,
    content: string,
    ctrl,
    enableContext: boolean,
    onMessage,
    onError,
    onClose
  ) => {
    const token = getAccessToken()
    const headers = {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${token}`
    }
    // 处理租户id请求头
    if (tenantEnable) {
      // 开启租户时，有则传递请求头，没有则不传递
      const tenantId = getTenantId()
      if (tenantId != undefined) {
        headers['tenant-id'] = tenantId
      }
    } else {
      // 未开启租户时，可以传递0，配合验证租户id=0的场景，服务端未开启租户时也不影响
      headers['tenant-id'] = 0
    }
    return fetchEventSource(
      pathResolve(import.meta.env.VITE_API_BASE_URL, import.meta.env.VITE_API_PREFIX) +
        `/ai/chat/message/send-stream?_platform=web`,
      {
        method: 'post',
        headers: headers,
        openWhenHidden: true,
        body: JSON.stringify({
          conversationId,
          content,
          useContext: enableContext
        }),
        onopen: async (res) => {
          // 若服务端响应非text/event-stream格式(sse响应格式)，那么终止请求重试，此时可能是认证鉴权失败，或其他服务端错误(application/json)
          if (!res.headers.get('content-type')?.startsWith('text/event-stream')) {
            let errorMsg = '服务响应异常'
            try {
              const json = JSON.parse(await res.text())
              if (json?.msg) {
                errorMsg = json.msg
              }
            } catch (error) {
            } finally {
              ctrl.abort() // 终止请求重试
              if (onError) onError(new Error(errorMsg))
            }
          }
        },
        onmessage: onMessage,
        onerror: onError,
        onclose: onClose,
        signal: ctrl.signal
      }
    )
  },

  // 删除AI chat 聊天消息
  deleteChatMessage: async (id: string) => {
    return await request.delete({ url: `/ai/chat/message/delete-my`, params: { id } })
  },

  // 删除指定AI chat 对话的消息
  deleteByConversationId: async (conversationId: number) => {
    return await request.delete({
      url: `/ai/chat/message/delete-my-by-conversation-id`,
      params: { conversationId }
    })
  },

  // 获得消息分页
  getChatMessagePage: async (params: any) => {
    return await request.get({ url: '/ai/chat/message/page', params })
  },

  // 管理员删除消息
  deleteChatMessageByAdmin: async (id: number) => {
    return await request.delete({ url: `/ai/chat/message/delete-by-admin`, params: { id } })
  }
}
